﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using SistemaDeBastanteodePoderes.Negocio;
using SistemaDeBastanteodePoderes.Dominio;
using SistemaDeBastanteodePoderes.Persistencia;

namespace SistemaDeBastanteodePoderes.Pruebas.Negocio
{
    [TestFixture]
    public class Test_H1_SupervisorService
    {
        IApplicationContext Spring = null;
        ISupervisorService Service = null;
        Cliente clienteRegistrado = null;
        TipoEmpresa tipoEmpCreado = null;

        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaPersistencia.xml",
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaNegocio.xml"
                );
            Service = (ISupervisorService)Spring.GetObject("supervisorService");
            tipoEmpCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Crear(new TipoEmpresa() { Abreviacion = "SAA", Descripcion = "SOCIEDAD ANONIMA ABIERTA" });

        }

        [Test]
        public void Test1_RegistrarCliente_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                clienteRegistrado = Service.RegistrarCliente("12345678901", "UPC", DateTime.Now, tipoEmpCreado.Codigo, 0);
            });
        }

        [Test]
        public void Test2_RegistrarCliente_OK()
        {

            Assert.DoesNotThrow(delegate
            {
                clienteRegistrado = Service.RegistrarCliente("12345678901", "UPC", DateTime.Now, tipoEmpCreado.Codigo, 10);
            });

            Assert.IsNotNull(clienteRegistrado);
            Assert.Greater(clienteRegistrado.Codigo, 0);
            Assert.AreEqual(clienteRegistrado.nroRUC, "12345678901");
            Assert.AreEqual(clienteRegistrado.razSocial, "UPC");
            Assert.AreEqual(clienteRegistrado.tipEmpresa.Codigo, tipoEmpCreado.Codigo);
            Assert.AreEqual(clienteRegistrado.cntEmpleados, 10);
        }

        [Test]
        public void Test3_RegistrarCliente_RUCRepetido()
        {
            Cliente clienteRUCRepetido = null;

            Assert.Catch<EntidadRepetidaException>(delegate
            {
                clienteRUCRepetido = Service.RegistrarCliente("12345678901", "UPC", DateTime.Now, tipoEmpCreado.Codigo, 20);
            });

            Assert.IsNull(clienteRUCRepetido);

        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteRegistrado);
            ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Eliminar(tipoEmpCreado);
            Spring.Dispose();
            Spring = null;
        }

    }
}